package cc.magicjson.scenario.implement.module.jdbc.template.response;

import cc.magicjson.scenario.implement.module.jdbc.template.util.ExceptionUtils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 批量操作结果封装类
 * @param <T> 返回的数据类型
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BatchOperationResult<T> {
    /**
     * 操作是否成功
     */
    private boolean success;

    /**
     * 响应码
     */
    private String code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 影响的行数
     */
    private int affectedRows;

    /**
     * 操作耗时(毫秒)
     */
    private long finishedTime;

    /**
     * 返回的数据
     */
    private T data;

    /**
     * 错误详情（如果有）
     */
    private String errorDetails;

    /**
     * 创建成功结果
     */
    public static <T> BatchOperationResult<T> success(String message, int affectedRows) {
        return success(message, affectedRows, null);
    }

    /**
     * 创建带数据的成功结果
     */
    public static <T> BatchOperationResult<T> success(String message, int affectedRows, T data) {
        return BatchOperationResult.<T>builder()
            .success(true)
            .code(ResultCode.SUCCESS.getCode())
            .message(message)
            .affectedRows(affectedRows)
            .data(data)
            .finishedTime(System.currentTimeMillis())
            .build();
    }

    /**
     * 创建失败结果
     */
    public static <T> BatchOperationResult<T> failure(String message, Exception e) {
        return BatchOperationResult.<T>builder()
            .success(false)
            .code(ResultCode.ERROR.getCode())
            .message(message)
            .errorDetails(ExceptionUtils.getStackTrace(e, 5))  // 只显示前5层堆栈
            .finishedTime(System.currentTimeMillis())
            .build();
    }

    /**
     * 创建带错误码的失败结果
     */
    public static <T> BatchOperationResult<T> failure(ResultCode resultCode, String message, Exception e) {
        return BatchOperationResult.<T>builder()
            .success(false)
            .code(resultCode.getCode())
            .message(message)
            .errorDetails(ExceptionUtils.getErrorSummary(e))  // 只显示简要错误信息
            .finishedTime(System.currentTimeMillis())
            .build();
    }

    /**
     * 创建详细的失败结果
     */
    public static <T> BatchOperationResult<T> failureWithDetails(
        ResultCode resultCode,
        String message,
        Exception e,
        boolean includeFullStackTrace) {
        return BatchOperationResult.<T>builder()
            .success(false)
            .code(resultCode.getCode())
            .message(message)
            .errorDetails(includeFullStackTrace ?
                ExceptionUtils.getStackTrace(e) :
                ExceptionUtils.getErrorSummary(e))
            .finishedTime(System.currentTimeMillis())
            .build();
    }
}
